package com.ueip.backend.utils;

import java.util.regex.Pattern;
/*
isValidIDCard 方法接收一个字符串参数 idCard，并使用正则表达式进行格式验证。
然后，如果身份证号码包含18位字符，则会调用 isValidIDCardChecksum 方法来检查身份证号码的校验位。

校验位的计算规则如下：

使用权重数组对身份证号码的前17位进行加权求和。
将所得到的和除以11，得到余数。
根据余数，在校验位对应值数组中查找对应的校验位。
检查校验位是否与实际的校验位相等。
如果身份证号码的格式和校验位都通过验证，isValidIDCard 方法返回 true，否则返回 false。

请注意，此代码只验证了身份证号码的格式和校验位，而没有验证身份证号码的有效性，如出生日期、地区码等。
*/

public class IDCardValidator {
    public static boolean isValidIDCard(String idCard) {
        // 身份证号码的正则表达式（支持15位和18位身份证号码）
        String regex = "^(\\d{15}$|^\\d{17}(?:\\d|x|X)$)";

        // 创建正则表达式模式
        Pattern pattern = Pattern.compile(regex);

        // 身份证号码格式校验
        if (!pattern.matcher(idCard).matches()) {
            return false;
        }

        // 检查身份证号码的校验位
        if (idCard.length() == 18) {
            if (!isValidIDCardChecksum(idCard)) {
                return false;
            }
        }

        return true;
    }

    private static boolean isValidIDCardChecksum(String idCard) {
        // 18位身份证号码权重
        int[] weight = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};

        // 校验位对应值
        String[] checksumValues = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};

        int sum = 0;
        for (int i = 0; i < 17; i++) {
            sum += (idCard.charAt(i) - '0') * weight[i];
        }

        int remainder = sum % 11;
        String checksum = checksumValues[remainder];
        char actualChecksum = idCard.charAt(17);

        return actualChecksum == checksum.charAt(0);
    }

    public static void main(String[] args) {
        String idCard = "51010219800101001X";
        if (isValidIDCard(idCard)) {
            System.out.println("身份证号码合法");
        } else {
            System.out.println("身份证号码非法");
        }
    }
}